home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 4 / QRZ Ham Radio Callsign Database - Volume 4.iso / files / dsp / fft / fteyaltr.z / fteyaltr / fftout32.c < prev    next >
C/C++ Source or Header  |  1991-08-25  |  7KB  |  283 lines

  1. /* ------------------------- fftouts.c -------------------------------- */
  2. /*                                    */
  3. /* Author:    Eyal Lebedinsky                        */
  4. /* Date:    May 1990                        */
  5. /* Version:    9 June 1991                        */
  6. /*                                    */
  7. /* called from fftg.c and generates ns32k .s                */
  8. /*                                    */
  9. /* This program is released into the public domain.            */
  10. /*                                    */
  11. /*----------------------------------------------------------------------*/
  12.  
  13. #include <stdio.h>
  14.  
  15. static int    label = 0;
  16.  
  17. void
  18. start_fft (file_name, ep_name)
  19. char    *file_name, *ep_name;
  20. {
  21.     char    fname[256];
  22.  
  23.     strcpy (fname, file_name);
  24.     strcat (fname, ".s");
  25.  
  26.     freopen (fname, "wt", stdout);
  27.     printf (" .text\n");
  28.     printf (" .align 2\n");
  29.     printf (" .globl _%s\n", ep_name);
  30.     printf ("_%s:\n", ep_name);
  31.     printf (" enter [r3,r4,r5,r6,r7],0\n");
  32. }
  33.  
  34. void
  35. end_fft (file_name, ep_name)
  36. char    *file_name, *ep_name;
  37. {
  38.     printf (" exit [r7,r6,r5,r4,r3]\n");
  39.     printf (" ret 0\n");
  40.     close (stdout);
  41. }
  42.  
  43. static void
  44. mulf (from, to, cc)
  45. int    from, to, cc;
  46. {
  47.     printf (" cmpqw 0,r%d\n", from);
  48.     printf (" absw  r%d,r%d\n", from, to-1);
  49.     if (cc >= 0) {
  50.         printf (" meiw  %d,r%d\n", cc, to-1);
  51.         printf (" blt   l%d\n", ++label);
  52.     } else {
  53.         printf (" meiw  %d,r%d\n", -cc, to-1);
  54.         printf (" bgt   l%d\n", ++label);
  55.     }
  56.     printf (" negw  r%d,r%d\n", to, to);
  57.     printf ("l%d:\n", label);
  58. }
  59.  
  60. void
  61. fft1 (i1)
  62. int    i1;
  63. {
  64. /* x[i] = x[i] >> 1; */
  65.     printf (" ashw -1,_x+%u(pc)\n", 2*i1);
  66. }
  67.  
  68. void
  69. fft2 (i1, i2)
  70. int    i1, i2;
  71. {
  72. /* t1 = x[i1] >> 1; */
  73.     printf (" movw _x+%u(pc),r1\n", 2*i1);
  74.     printf (" ashw -1,r1\n");
  75.     printf (" movw _x+%u(pc),r2\n", 2*i2);
  76.     printf (" ashw -1,r2\n");
  77. /* x[i1] = t1 + (x[i2] >> 1); */
  78.     printf (" movw r1,r0\n");
  79.     printf (" addw r2,r0\n");
  80.     printf (" movw r0,_x+%u(pc)\n", 2*i1);
  81. /* x[i2] = t1 - (x[i2] >> 1); */
  82.     printf (" subw r2,r1\n");
  83.     printf (" movw r1,_x+%u(pc)\n", 2*i2);
  84. }
  85.  
  86. void
  87. fft3 (i1, i3, i4)
  88. int    i1, i3, i4;
  89. {
  90. /* x[i4] = ((x[i4] >> 1) - (x[i3] >> 1)) >> 1; */
  91.     printf (" movw _x+%u(pc),r4\n", 2*i4);
  92.     printf (" ashw -1,r4\n");
  93.     printf (" movw _x+%u(pc),r3\n", 2*i3);
  94.     printf (" ashw -1,r3\n");
  95.     printf (" movw r4,r0\n");
  96.     printf (" subw r3,r0\n");
  97.     printf (" ashw -1,r0\n");
  98.     printf (" movw r0,_x+%u(pc)\n", 2*i4);
  99. /* t1    = ((x[i4] >> 1) + (x[i3] >> 1)) >> 1; */
  100.     printf (" addw r3,r4\n");
  101.     printf (" ashw -1,r4\n");        /* r4 = t1 */
  102. /* x[i3] =  (x[i1] >> 1) - t1; */
  103.     printf (" movw _x+%u(pc),r1\n", 2*i1);
  104.     printf (" ashw -1,r1\n");
  105.     printf (" movw r1,r0\n");
  106.     printf (" subw r4,r0\n");
  107.     printf (" movw r0,_x+%u(pc)\n", 2*i3);
  108. /* x[i1] =  (x[i1] >> 1) + t1 */
  109.     printf (" addw r4,r1\n");
  110.     printf (" movw r1,_x+%u(pc)\n", 2*i1);
  111. }
  112.  
  113. void
  114. fft4 (i1, i2, i3, i4, cc1)
  115. int    i1, i2, i3, i4, cc1;
  116. {
  117. /* t3 = mulf (x[i3], cc1); */
  118.     printf (" movw _x+%u(pc),r2\n", 2*i3);
  119.     mulf (2, 3, cc1);
  120. /* t4 = mulf (x[i4], cc1); */
  121.     printf (" movw _x+%u(pc),r5\n", 2*i4);
  122.     mulf (5, 5, cc1);            /* result in r5 = t4 */
  123. /* tt2 = t3 - t4; */
  124.     printf (" movw r3,r0\n");
  125.     printf (" subw r5,r3\n");        /* r3 = tt2 */
  126. /* tt1 = t3 + t4; */
  127.     printf (" addw r0,r5\n");        /* r5 = tt1 */
  128.  
  129.     printf (" movw _x+%u(pc),r1\n", 2*i1);
  130.     printf (" ashw -2,r1\n");        /* r1 = x[i1] */
  131.     printf (" movw _x+%u(pc),r2\n", 2*i2);
  132.     printf (" ashw -1,r2\n");        /* r2 = x[i2] */
  133. /* x[i3] = -(x[i2] >> 1) - t1; */
  134.     printf (" negw r5,r0\n");        /* - tt1 */
  135.     printf (" subw r2,r0\n");        /* -x[i2] - tt1 */
  136.     printf (" movw r0,_x+%u(pc)\n", 2*i3);
  137. /* x[i4] =  (x[i2] >> 1) - t1; */
  138.     printf (" subw r5,r2\n");        /* x[i2] - tt1 */
  139.     printf (" movw r2,_x+%u(pc)\n", 2*i4);
  140. /* x[i2] =  (x[i1] >> 2) - t2; */
  141.     printf (" movw r1,r0\n");        /* x[i1] */
  142.     printf (" subw r3,r0\n");        /* x[i1] - tt2 */
  143.     printf (" movw r0,_x+%u(pc)\n", 2*i2);
  144. /* x[i1] =  (x[i1] >> 2) + t2; */
  145.     printf (" addw r3,r1\n");        /* x[i1] + tt2 */
  146.     printf (" movw r1,_x+%u(pc)\n", 2*i1);
  147. }
  148.  
  149. void
  150. fft5 (i1, i2, i3, i4, i5, i6, i7, i8, sm1, sp1, cc1, sm3, sp3, cc3, ind)
  151. int    i1, i2, i3, i4, i5, i6, i7, i8, sm1, sp1, cc1, sm3, sp3, cc3, ind;
  152. {
  153. /* t5 = x[i7]; */
  154.     printf (" movw _x+%u(pc),r5\n", 2*i7);        /* t5 = r5 */
  155. /* t1 = mulf (t5, sm1); */
  156.     mulf (5, 1, sm1);                /* t1 = r1 ***/
  157. /* t6 = x[i3]; */
  158.     printf (" movw _x+%u(pc),r6\n", 2*i3);        /* t6 = r6 */
  159. /* if (ind) */
  160. /*   t6 >>= 1; */
  161.     if (ind)
  162.         printf (" ashw -1,r6\n");
  163. /* t5 += t6; */
  164.     printf (" addw r6,r5\n");
  165. /* t2 = mulf (t6, sp1); */
  166.     mulf (6, 7, sp1);                /* t2 = r7 */
  167. /* t5 = mulf (t5, cc1); */
  168.     mulf (5, 5, cc1);                /* t5 = r5 */
  169. /* t1 += t5; */
  170.     printf (" addw r5,r1\n");            /* t1 = r1 */
  171. /* t2 += t5; */
  172.     printf (" addw r5,r7\n");
  173.     printf (" movw r7,r0\n");            /* t2 = r0 ***/
  174.  
  175. /* t5 = x[i8]; */
  176.     printf (" movw _x+%u(pc),r5\n", 2*i8);        /* t5 = r5 */
  177. /* t3 = mulf (t5, sm3); */
  178.     mulf (5, 3, sm3);                /* t3 = r3 ***/
  179. /* t6 = x[i4]; */
  180.     printf (" movw _x+%u(pc),r6\n", 2*i4);        /* t6 = r6 */
  181. /* if (ind) */
  182. /*   t6 >>= 1; */
  183.     if (ind)
  184.         printf (" ashw -1,r6\n");
  185. /* t5 += t6; */    
  186.     printf (" addw r6,r5\n");
  187. /* t4 = mulf (t6, sp3); */
  188.     mulf (6, 7, sp3);                /* t4 = r7 */
  189. /* t5 = mulf (t5, cc3); */
  190.     mulf (5, 5, cc3);
  191. /* t3 += t5; */
  192.     printf (" addw r5,r3\n");
  193. /* t4 += t5; */
  194.     printf (" addw r7,r5\n");            /* t4 = r5 ***/
  195.  
  196.                 /* t= 1 2 3 4 5 6 */
  197.                 /* r= 1 0 3 5 7 6 */
  198. /* t5 = t3 - t1; */
  199.     printf (" movw r3,r7\n");
  200.     printf (" subw r1,r7\n");
  201. /* t6 =  x[i2] >> 1; */
  202.     printf (" movw _x+%u(pc),r6\n", 2*i2);
  203.     printf (" ashw -1,r6\n");
  204. /* x[i7] = t5 - t6; */
  205.     printf (" movw r7,r2\n");
  206.     printf (" subw r6,r2\n");
  207.     printf (" movw r2,_x+%u(pc)\n", 2*i7);
  208. /* x[i4] =  t5 + t6; */
  209.     printf (" addw r6,r7\n");
  210.     printf (" movw r7,_x+%u(pc)\n", 2*i4);
  211. /* t5 = t2 + t4;*/
  212.     printf (" movw r0,r7\n");
  213.     printf (" addw r5,r7\n");
  214. /* t6    =  x[i6] >> 1; */
  215.     printf (" movw _x+%u(pc),r6\n", 2*i6);
  216.     printf (" ashw -1,r6\n");
  217. /* x[i3] = t5 - t6; */
  218.     printf (" movw r7,r2\n");
  219.     printf (" subw r6,r2\n");
  220.     printf (" movw r2,_x+%u(pc)\n", 2*i3);
  221. /* x[i8] = t5 + t6;*/
  222.     printf (" addw r6,r7\n");
  223.     printf (" movw r7,_x+%u(pc)\n", 2*i8);
  224. /* t5 = t1 + t3; */
  225.     printf (" movw r1,r7\n");
  226.     printf (" addw r3,r7\n");
  227. /* t6    =  x[i1] >> 1; */
  228.     printf (" movw _x+%u(pc),r6\n", 2*i1);
  229.     printf (" ashw -1,r6\n");
  230. /* x[i6] = t6 - t5; */
  231.     printf (" movw r6,r2\n");
  232.     printf (" subw r7,r2\n");
  233.     printf (" movw r2,_x+%u(pc)\n", 2*i6);
  234. /* x[i1] = t5 + t6; */
  235.     printf (" addw r6,r7\n");
  236.     printf (" movw r7,_x+%u(pc)\n", 2*i1);
  237. /* t5 = t2 - t4; */
  238.     printf (" movw r0,r7\n");
  239.     printf (" subw r5,r7\n");
  240. /* t6 = x[i5] >> 1; */
  241.     printf (" movw _x+%u(pc),r6\n", 2*i5);
  242.     printf (" ashw -1,r6\n");
  243. /* x[i5] = t6 - t5; */
  244.     printf (" movw r6,r2\n");
  245.     printf (" subw r7,r2\n");
  246.     printf (" movw r2,_x+%u(pc)\n", 2*i5);
  247. /* x[i2] = t5 + t6; */
  248.     printf (" addw r6,r7\n");
  249.     printf (" movw r7,_x+%u(pc)\n", 2*i2);
  250. }
  251.  
  252. void
  253. fft7 (i1, i2)
  254. int    i1, i2;
  255. {
  256. /* lt1 = x[i2]; */
  257.     printf (" movw _x+%u(pc),r0\n", 2*i2);
  258. /* lt1 *= lt1; */
  259.     printf (" absw r0,r0\n");
  260.     printf (" meiw r0,r0\n");
  261. /* qf[i1] = lt1 >> 16; */
  262.     printf (" movw r1,_qf+%u(pc)\n", 2*i1);
  263. }
  264.  
  265. void
  266. fft8 (i1, i2, i3)
  267. int    i1, i2, i3;
  268. {
  269. /* lt1 = x[i2]; */
  270.     printf (" movw _x+%u(pc),r0\n", 2*i2);
  271. /* lt1 *= lt1; */
  272.     printf (" absw r0,r0\n");
  273.     printf (" meiw r0,r0\n");
  274. /* lt2 = x[i3]; */
  275.     printf (" movw _x+%u(pc),r2\n", 2*i3);
  276. /* lt2 *= lt2; */
  277.     printf (" absw r2,r2\n");
  278.     printf (" meiw r2,r2\n");
  279. /* qf[i1] = (lt1 + lt2) >> 16; */
  280.     printf (" addw r3,r1\n");
  281.     printf (" movw r1,_qf+%u(pc)\n", 2*i1);
  282. }
  283.